package com.juben.svr.demos.web;

import org.apache.commons.io.FilenameUtils;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.*;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageOutputStream;
import javax.xml.transform.Result;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


@RestController
@RequestMapping("/api")
public class ImageController {

    private static final String UPLOAD_DIR = "D:\\学习资料\\毕业设计\\image\\carouselimg";  //图片路径

    @GetMapping("/images/{filename}")
    public ResponseEntity<Resource> getImage(@PathVariable String filename) {
        try {
            // 验证文件名以避免潜在的安全问题，如路径遍历
            if (filename.contains("..") || filename.startsWith("/") || filename.endsWith("/") || filename.isEmpty()) {
                return ResponseEntity.badRequest().body(null); // 返回400 Bad Request
            }

            // 构建文件路径
            Path file = Paths.get(UPLOAD_DIR, filename).normalize();
            // 使用FileSystemResource而不是将URI转换为String
            Resource resource = new FileSystemResource(file.toFile());
            // 只需要检查文件是否存在，因为如果存在且没有读取权限，Spring在尝试读取时会抛出异常
            if (resource.exists() && resource.isReadable()) {
                // 获取文件扩展名对应的内容类型（MIME类型）
                // 获取文件扩展名
                String contentType = getContentType(filename);
                // 设置响应的内容类型头，并返回文件资源
                return ResponseEntity.ok()
                        .contentType(MediaType.parseMediaType(contentType))
                        .body(resource);
            } else {
                // 文件不存在或不可读，返回404 Not Found
                return ResponseEntity.notFound().build();
            }
        } catch (Exception e) {
            // 在这里可以记录更详细的错误信息到日志
            // 例如：logger.error("Error processing file request", e);
            // 发生异常时返回500 Internal Server Error
            return ResponseEntity.internalServerError().build();
        }
    }
    // 根据文件扩展名获取内容类型（MIME类型）
    private String getContentType(String filename) {
        // 检查文件扩展名，并返回相应的内容类型
        if (filename.endsWith(".jpg") || filename.endsWith(".jpeg")) {
            return "image/jpeg";
        } else if (filename.endsWith(".png")) {
            return "image/png";
        } else if (filename.endsWith(".gif")) {
            return "image/gif";
        } else {
            // 默认返回二进制流数据（Byte Stream）
            return "application/octet-stream";
        }
    }
    // 图片文件上传接口
    @CrossOrigin(origins = "http://localhost:5173")
    @PostMapping("/upload")
    public ResponseEntity<Map<String, String>> uploadImage(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return ResponseEntity.badRequest().body(Collections.singletonMap("message", "请选择要上传的图片"));
        }
        try {
            // 保存文件到服务器某个目录
            File dest = new File(UPLOAD_DIR, file.getOriginalFilename());  // 文件保存路径
            file.transferTo(dest);

            // 创建返回响应体，包含上传文件的文件名
            Map<String, String> response = new HashMap<>();
            response.put("message", "图片上传成功-----");
            response.put("upFile", file.getOriginalFilename()); // 返回文件名

            return ResponseEntity.ok(response);
        } catch (IOException e) {
            return ResponseEntity.badRequest().body(Collections.singletonMap("message", "图片上传失败"));
        }
    }


}
